import pymysql as mysql
from dbutils.pooled_db import PooledDB


class MySqlPool(object):
    config = {"creator": mysql,  # 使用链接数据库的模块
        "host": "localhost", "port": 3306, "user": "root", "password": "123456", "db": "gwt", "charset": "utf8",
        "autocommit": True, "mincached": 10,  # 启动时开启的闲置连接数量(缺省值 0 开始时不创建连接)
        "maxconnections": 70,  # 连接池最大连接数量
        "maxcached": 10,  # 连接池中允许的闲置的最多连接数量
        "maxshared": 10,  # 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用
        "blocking": True,  # 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......> 其他代表阻塞直到连接数减少,连接被分配)
        "maxusage": 0,  # 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)
        "setsession": [],  # 一个可选的SQL命令列表用于准备每个会话，如["set datestyle to german", ...]，常用于做初始化命令
        "cursorclass": mysql.cursors.DictCursor  # 返回类型，dict
    }

    pool = PooledDB(**config)  # 单例模式创建出池子

    def get_db(self):
        self.conn = MySqlPool.pool.connection()
        self.cursor = self.conn.cursor()
        return self

    def close(self):
        self.cursor.close()
        self.conn.close()

    def __enter__(self):
        return self.get_db()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

'''
# 使用方式一
with MySqlPool() as db:
    db.cursor.execute("select * from app01_user;")
    print(db.cursor.fetchall())

# 使用方式二
db = MySqlPool().get_db()
db.cursor.execute("insert into app01_user (user_name,user_password,user_type) values ('baby',123,3);")
print(db.cursor.fetchall())
db.close()
 '''

